/*
 * @Author: Wangjun
 * @Date: 2021-08-16 09:07:58
 * @LastEditTime: 2021-08-16 09:32:47
 * @LastEditors: Wangjun
 * @Description:
 * @FilePath: \lua\luatask\task.go
 * hnxr
 */
package luatask

import (
	"time"

	"gitee.com/haodreams/golib/logs"
	lua "github.com/yuin/gopher-lua"
)

//Task .
type Task struct {
	Time         string //执行时间
	Path         string //路径
	Desc         string //描述
	UsedTime     string //执行任务耗时
	LastCallTime int64  //最后一次调用的开始时间
	LastMsg      string
	Count        int
	l            *lua.LState
	id           int

	Work         func(path string, cb func(l *lua.LState)) (err error) `json:"-"`
	initCallback func(l *lua.LState)                                   //回调函数，执行每次的脚本的时候运行
}

//Tasks 任务组
type Tasks struct {
	Time  string
	ID    int
	tasks []*Task
}

//Cancel 取消任务
func (m *Task) Cancel() {
	m.l = nil
}

//Run 运行任务
func (m *Tasks) Run() {
	for _, task := range m.tasks {
		if task != nil {
			now := time.Now()
			task.LastCallTime = now.Unix()
			task.Run()
			task.UsedTime = time.Since(now).String()
			task.Count++
		}
	}
}

//SyncTask 异步
type SyncTask struct {
	taskMap map[string]*Tasks
	array   []*Task
}

//GetTasks 获取全部的任务
func (m *SyncTask) GetTasks() []*Task {
	return m.array
}

//AsyncTask 异步
type AsyncTask struct {
	Tasks
}

//GetTasks 获取全部的任务
func (m *AsyncTask) GetTasks() []*Task {
	return m.tasks
}

//Run 定时执行
func (m *Task) Run() {
	if m.Work != nil {
		//主要用于防止并发，走向另一个分支
		err := m.Work(m.Path, m.initCallback)
		if err != nil {
			m.LastMsg = err.Error()
		}
	} else if m.l != nil {
		//log.Println(m.id, m.Path)
		err := m.l.CallByParam(
			lua.P{
				Fn:      m.l.GetGlobal("run"),
				NRet:    0,
				Protect: true,
			})
		if err != nil {
			m.LastMsg = err.Error()
			logs.Error(m.Path, err.Error())
			return
		}
	}
}
